package top.yangbuyi.utils;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.*;
import java.io.*;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.X509Certificate;


/**
 * @description: 杨不易网站:www.yangbuyi.top
 * @program: yangbuyiopenHis2020
 * @ClassName: HttpUtils
 * @create: 2020-08-27 20:28
 * @author: yangbuyi
 * @since： JDK1.8
 * @HttpUtils: 通用http发送方法$
 **/

public class HttpUtils {

	  private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);

	  /**
	   * 向指定 URL 发送GET方法的请求
	   *
	   * @param url   发送请求的 URL
	   * @param param 请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
	   * @return 所代表远程资源的响应结果
	   */
	  public static String sendGet(String url, String param) {
			StringBuilder result = new StringBuilder();
			BufferedReader in = null;
			try {
				  String urlNameString = url + "?" + param;
				  log.info("sendGet - {}", urlNameString);
				  URLConnection connection = getUrlConnection(urlNameString);
				  connection.connect();
				  in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
				  String line;
				  while ((line = in.readLine()) != null) {
						result.append(line);
				  }
				  log.info("recv - {}", result);
			} catch (ConnectException e) {
				  log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);
			} catch (SocketTimeoutException e) {
				  log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);
			} catch (IOException e) {
				  log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);
			} catch (Exception e) {
				  log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);
			} finally {
				  try {
						if (in != null) {
							  in.close();
						}
				  } catch (Exception ex) {
						log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
				  }
			}
			return result.toString();
	  }

	  /**
	   * 向指定 URL 发送POST方法的请求
	   *
	   * @param url   发送请求的 URL
	   * @param param 请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
	   * @return 所代表远程资源的响应结果
	   */
	  public static String sendPost(String url, String param) {
			PrintWriter out = null;
			BufferedReader in = null;
			StringBuilder result = new StringBuilder();
			try {
				  String urlNameString = url + "?" + param;
				  log.info("sendPost - {}", urlNameString);
				  URLConnection conn = getUrlConnection(urlNameString);
				  conn.setRequestProperty("Accept-Charset", "utf-8");
				  conn.setRequestProperty("contentType", "utf-8");
				  conn.setDoOutput(true);
				  conn.setDoInput(true);
				  out = new PrintWriter(conn.getOutputStream());
				  out.print(param);
				  out.flush();
				  in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
				  String line;
				  while ((line = in.readLine()) != null) {
						result.append(line);
				  }
				  log.info("recv - {}", result);
			} catch (ConnectException e) {
				  log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
			} catch (SocketTimeoutException e) {
				  log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
			} catch (IOException e) {
				  log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
			} catch (Exception e) {
				  log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
			} finally {
				  try {
						if (out != null) {
							  out.close();
						}
						if (in != null) {
							  in.close();
						}
				  } catch (IOException ex) {
						log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
				  }
			}
			return result.toString();
	  }

	  private static URLConnection getUrlConnection(String urlNameString) throws IOException {
			URL realUrl = new URL(urlNameString);
			URLConnection conn = realUrl.openConnection();
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent",
					"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			return conn;
	  }

	  public static String sendSSLPost(String url, String param) {
			StringBuilder result = new StringBuilder();
			String urlNameString = url + "?" + param;
			try {
				  log.info("sendSSLPost - {}", urlNameString);
				  SSLContext sc = SSLContext.getInstance("SSL");
				  sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
				  URL console = new URL(urlNameString);
				  HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
				  conn.setRequestProperty("accept", "*/*");
				  conn.setRequestProperty("connection", "Keep-Alive");
				  conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
				  conn.setRequestProperty("Accept-Charset", "utf-8");
				  conn.setRequestProperty("contentType", "utf-8");
				  conn.setDoOutput(true);
				  conn.setDoInput(true);

				  conn.setSSLSocketFactory(sc.getSocketFactory());
				  conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
				  conn.connect();
				  InputStream is = conn.getInputStream();
				  BufferedReader br = new BufferedReader(new InputStreamReader(is));
				  String ret = "";
				  while ((ret = br.readLine()) != null) {
						if (ret != null && !ret.trim().equals("")) {
							  result.append(new String(ret.getBytes("ISO-8859-1"), "utf-8"));
						}
				  }
				  log.info("recv - {}", result);
				  conn.disconnect();
				  br.close();
			} catch (ConnectException e) {
				  log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
			} catch (SocketTimeoutException e) {
				  log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
			} catch (IOException e) {
				  log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
			} catch (Exception e) {
				  log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
			}
			return result.toString();
	  }

	  private static class TrustAnyTrustManager implements X509TrustManager {
			@Override
			public void checkClientTrusted(X509Certificate[] chain, String authType) {
			}

			@Override
			public void checkServerTrusted(X509Certificate[] chain, String authType) {
			}

			@Override
			public X509Certificate[] getAcceptedIssuers() {
				  return new X509Certificate[]{};
			}
	  }

	  private static class TrustAnyHostnameVerifier implements HostnameVerifier {
			@Override
			public boolean verify(String hostname, SSLSession session) {
				  return true;
			}
	  }

}
